package com.ds.infra.im.codec;

import com.ds.infra.im.protocol.ProtocolMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 自定义协议编码器
 */
public class CustomProtocolEncoder extends MessageToByteEncoder<ProtocolMsg> {

    @Override
    protected void encode(ChannelHandlerContext ctx, ProtocolMsg msg, ByteBuf out) throws Exception {
        // 1. 魔数 (2字节)
        out.writeShort(ProtocolMsg.MAGIC_NUMBER);
        // 2. 版本号 (1字节)
        out.writeByte(msg.getVersion());
        // 3. 序列化算法 (1字节)
        out.writeByte(msg.getSerializerAlgorithm());
        // 4. 指令类型 (1字节)
        out.writeByte(msg.getCommand());
        // 5. 数据长度 (4字节)
        out.writeInt(msg.getLength());
        // 6. 数据内容 (N字节)
        if (msg.getData() != null && msg.getLength() > 0) {
            out.writeBytes(msg.getData());
        }
    }
}
